home *** CD-ROM | disk | FTP | other *** search
/ Apple II Magazines (PO) / Nibble Volume 10, No. 03 (1989-03)(MicroSPARC)(Side A).zip / Nibble Volume 10, No. 03 (1989-03)(MicroSPARC)(Side A).po / VISIT.MON.S < prev    next >
Text File  |  1996-12-24  |  13KB  |  411 lines

  1. ********************************
  2. *                              *
  3. *  Visit Monitor CDA (ROM 01)  *
  4. *                              *
  5. *        Interpreted by        *
  6. *        Sandy Mossberg        *
  7. *                              *
  8. *      Copyright (C) 1988      *
  9. *      by MicroSPARC, Inc.     *
  10. *      Concord, MA  01742      *
  11. *                              *
  12. *      Merlin-16 Assembler     *
  13. *                              *
  14. ********************************
  15.           TR ON
  16.           TTL "Visit Monitor CDA"
  17.  
  18. * General Equates:
  19.  
  20. PTR       = $06          ;pointer (2-byte or 4-byte)
  21. CH        = $24          ;column position
  22. CV        = $25          ;row position
  23. USRADR    = $3F8         ;user CTL-Y vector
  24. INITSLOT3 = $C300        ;init slot 3 ROM
  25. PRBL2     = $F94A        ;print X spaces
  26. INIT      = $FB2F        ;init text screen
  27. VTAB      = $FC22        ;set vertical tab
  28. HOME      = $FC58        ;clear screen and home cursor
  29. COUT      = $FDED        ;output char via CSW hook
  30. COUT1     = $FDF0        ;output char directly
  31. SETNORM   = $FE84        ;set normal text mode
  32. SETKBD    = $FE89        ;set standard keyboard input
  33. SETVID    = $FE93        ;set standard screen output
  34. MONZ      = $FF69        ;standard monitor entry
  35. MONZ2     = $FF6C        ;alternate monitor entry
  36. MSGPOINTER = $E100C0     ;ptr to Message Address Table
  37. MP_Install = $FF1800     ;install Memory Peeker CDA
  38.  
  39. * Soft Switches:
  40.  
  41. SETSLOTCXROM = $C006     ;enable slot ROM
  42. SETINTCXROM = $C007      ;enable internal ROM
  43. CYAREG    = $C036        ;speed/motor register
  44. STATEREG  = $C068        ;state register
  45.  
  46. * Direct Page (used for vectoring):
  47.  
  48. To_MON    = $F7          ;enter monitor
  49. To_CDA    = $FB          ;reenter CDA
  50.  
  51. *===============================
  52. * Supporting Subroutines for CDA:
  53. *-------------------------------
  54. * Set Fast System Speed:
  55. *-------------------------------
  56.           ORG $FFA1AB
  57.  
  58. SetFast   SEP %00110000  ;set m,x flags
  59.           XBA            ;save accum LSB (in accum MSB)
  60.           LDA #$80       ;turn on fast
  61.           TSB CYAREG     ; system speed
  62.           XBA            ;restore original accum LSB
  63.           STA SETINTCXROM ;use internal ROM
  64.           RTS
  65. *-------------------------------
  66. * Execute System Monitor Subroutine:
  67. *-------------------------------
  68.           ORG $FFA932
  69.  
  70. * ENTRY:| address-1 of monitor subroutine on stack +1/+2
  71. *       | address+2 of caller on stack +3/+4
  72. *
  73. * EXECUTION | 1. SetEmulate subroutine  (RTL from DoF8MonSub)
  74. * SEQUENCE: | 2. Monitor subroutine     (RTS from SetEmulate)
  75. *           | 3. SetNative subroutine   (RTS from monitor subr)
  76. *           | 4. SetFast subroutine     (RTL from SetNative)
  77. *           | 5. Return to caller+3     (RTS from SetFast)
  78.  
  79. DoF8MonSub XBA           ;save entry accum LSB
  80.           TXA            ;save entry X-reg
  81.           REP %00110000  ;clear m,x flags
  82.           PLX            ;get entry subroutine addr-1
  83.           PHK            ;put 3-byte address
  84.           PEA SetFast-1  ; of SetFast on stack
  85.           PEA SetNative-1 ;2-byte SetNative on stack
  86.           PHX            ;2-byte monitor subroutine on stack
  87.           SEP %00110000  ;set m,x flags
  88.           TAX            ;restore X-reg
  89.           XBA            ;restore accum LSB
  90. DoMonSub1 XBA            ;save accum LSB
  91.           JSR SetSpeed   ;set speed
  92.           XBA            ;restore accum LSB
  93.           PHB            ;put 3-byte address
  94.           PEA SetEmulate-1 ; of SetEmulate on stack
  95.           STA SETSLOTCXROM ;kick in peripheral ROM
  96.           RTL            ;let the executions commence
  97. *-------------------------------
  98. * Set and Execute System Monitor Subroutines:
  99. *-------------------------------
  100. * EXIT:| address-1 of monitor subroutine on stack +1/+2
  101. *      | address+2 of caller on stack +3/+4
  102. *
  103. * Starred monitor subroutines used by CDA or supporting code:
  104.  
  105. DoPRBLNK  LDX #$03
  106. DoPRBL2   PEA PRBL2-1
  107.           BRA DoF8MonSub
  108.  
  109. DoCROUT   LDA #$8D
  110. DoCOUT    PEA COUT-1     ;***
  111.           BRA DoF8MonSub
  112.  
  113. DoCOUT1   PEA COUT1-1
  114.           BRA DoF8MonSub
  115.  
  116. DoMONZ2   PEA MONZ2-1
  117.           BRA DoMonSub1
  118.  
  119. SetCHCV   STX CH
  120.           STY CV
  121. DoVTAB    PEA VTAB-1
  122.           BRA DoF8MonSub
  123.  
  124. DoINITSLOT3 PEA INITSLOT3-1
  125.           BRA DoF8MonSub
  126.  
  127. DoHOME    PEA HOME-1     ;***
  128.           BRA DoF8MonSub
  129.  
  130. DoSet40IO PEA SetIO40-1
  131.           BRA DoF8MonSub
  132. *===============================
  133. * Unsupporting Subroutines Adjacent to CDA:
  134. *-------------------------------
  135. * Initialize Slot 3 I/O:
  136. *-------------------------------
  137. InitSlot3 LDA #$98       ;unprintable char
  138.           JSR DoINITSLOT3 ;init slot 3
  139.           LDA #$00
  140.           STAL $E10136   ;clear flag (?)
  141.           RTS
  142. *-------------------------------
  143. * Copy Alternate Text Page:
  144. *-------------------------------
  145. CopyAltPage LDA #$01     ;flag saving of alternate
  146.           STAL $E10174   ; text page ($800-$BFF)
  147.           REP %00110000  ;clear m,x flags
  148.           LDX #$0800     ;start of move
  149.           TXY            ;destination of move
  150.           LDA #$03FF     ;$400 bytes to move
  151.           MVN $00,$E00000 ;move from bank $00 to bank $E0
  152.           RTL
  153. *===============================
  154. * CDA Installation Code:
  155. *-------------------------------
  156. CDA_Install LDAL $E1017D ;check CDA installed flag
  157.           ASL
  158.           BMI CDAIn      ;CDAs already installed
  159.           REP %00110000  ;clear m,x flags
  160.           PEA ^VM_Handle ;handle to CDA
  161.           PEA VM_Handle
  162.           LDX #$0F05     ;InstallCDA call
  163.           JSL $E10000    ; (Visit Monitor)
  164.           JSL MP_Install ;Install Memory Peeker CDA
  165.           SEP %00110000  ;set m,x flags
  166. CDAIn     LDA #$C0       ;set CDA installed
  167.           STAL $E1017D   ; flag
  168.           RTS
  169. *===============================
  170. * CDA Handle:
  171. *-------------------------------
  172. VM_Handle ADRL VM_Header ;handle to CDA header
  173.  
  174. *===============================     ---> START OF CDA CODE <---
  175. * CDA Header:
  176. *-------------------------------
  177. VM_Header STR "Visit Monitor"  ;title string
  178.           ADRL VM_Startup    ;ptr to startup code
  179.           ADRL VM_Shutdown    ;ptr to shutdown code
  180.  
  181. *===============================
  182. * Main CDA Code:
  183. *-------------------------------
  184. * ENTER MONITOR:
  185. *-------------------------------
  186. * Address data in bank zero:
  187.  
  188. VM_Startup SEP %00110000 ;set m,x flags
  189.           SEI            ;disable IRQ interrupts
  190.           PEA $0000      ;set data bank
  191.           PLB            ; equal to zero
  192.           PLB            ;set stack right
  193.  
  194. * Save existing CTL-Y vector (bank zero):
  195.  
  196.           LDX #$02       ;index 3 bytes
  197. SaveCTLY  LDA USRADR,X   ;get original vector byte
  198.           PHA            ;save on stack
  199.           DEX
  200.           BPL SaveCTLY   ;back for another byte
  201.  
  202. * Set CDA's CTL-Y vector in page 3 (bank zero):
  203.  
  204.           LDA #$4C       ;vector: JMP $00FB
  205.           STA USRADR
  206.           LDA #To_CDA
  207.           STA USRADR+1
  208.           STZ USRADR+2
  209.  
  210. * Save existing direct page code ($F7-$FF):
  211.  
  212.           LDX #$08       ;index 9 bytes
  213. SaveZP    LDA To_MON,X   ;get original direct page byte
  214.           PHA            ;save on stack
  215.           DEX
  216.           BPL SaveZP     ;back for another byte
  217.  
  218. * Stuff vectoring code into direct page:
  219.  
  220.           PHB            ;save data bank (=0)
  221.           PHK            ;equate program bank
  222.           PLB            ; and data bank
  223.           LDX #$08       ;index 9 bytes
  224. SetZP     LDA BZ_Code,X  ;get our vectoring code and
  225.           STA To_MON,X   ; stuff into direct page
  226.           DEX
  227.           BPL SetZP      ;back for another byte
  228.           PLB            ;restore data bank (=0)
  229.           PHK            ;modify direct page return address
  230.           PLA            ; by stuffing current program
  231.           STA To_CDA+4   ; bank into return vector
  232.  
  233. * Print instructions on screen:
  234.  
  235.           LDA STATEREG   ;save state register
  236.           PHA            ; on stack
  237.           JSR DoHOME     ;clear screen and home cursor
  238.           LDA #$FD       ;print message
  239.           JSR PrintMsg   ; on screen
  240.           PLA            ;restore entry
  241.           STA STATEREG   ; state register
  242.  
  243. * Enter monitor:
  244.  
  245.           SEC            ;set emulation
  246.           XCE            ; mode
  247.           JML To_MON     ;enter monitor via direct page
  248. *-------------------------------
  249. * RETURN FROM MONITOR:
  250. *-------------------------------
  251. VM_Return PLA            ;remove monitor subroutine
  252.           PLA            ; return address from stack
  253.           PEA $0000      ;set data bank
  254.           PLB            ; equal to zero
  255.           PLB            ;set stack right
  256.           CLC            ;set native
  257.           XCE            ; mode
  258.           CLI            ;enable interrupts
  259.  
  260. * Restore original direct page code ($F7-$FF):
  261.  
  262.           LDX #$00
  263. RestoreZP PLA            ;get original direct page byte
  264.           STA To_MON,X   ;restore direct page byte
  265. Restore   INX
  266.           CPX #$09       ;get 10 bytes
  267.           BCC RestoreZP  ;back for another direct page byte
  268.           PLA
  269.           STA USRADR-9,X ;restore CTL-Y vector
  270.           CPX #$0B       ;get 3 ($0B-$09+1) CTL-Y bytes
  271.           BCC Restore    ;back for another byte
  272.           REP %00110000  ;clear m,x flags
  273. VM_Shutdown RTL          ;exit CDA
  274.  
  275. *-------------------------------
  276. * VECTORING CODE COPIED TO DIRECT PAGE:
  277. *-------------------------------
  278. VM_RETURN = $AA2A
  279.  
  280. * Direct page locations in parentheses:
  281.  
  282. BZ_Code   CLI            ;enable interrupts  ($F7)
  283.           JMP MONZ       ;enter monitor      ($F8-$FA)
  284.  
  285.           SEI            ;disable interrupts ($FB)
  286.           JML VM_RETURN  ;return to CDA      ($FC-$FF)
  287.                          ;bank byte modified by CDA
  288.  
  289.                          ;---> END OF CDA CODE <---
  290. *===============================
  291. * Print Message:
  292. *-------------------------------
  293. * MAT = Message Address Table (254 2-byte pointers to messages)
  294. * MTT = Message Text Table (text of messages)
  295. *
  296. * ENTRY:| A-reg holds offset in MAT
  297.  
  298.           ORG $FFC080
  299.  
  300. * Set pointer to desired message:
  301.  
  302. PrintMsg  REP %00110000  ;clear m,x flags
  303.           AND #$00FF     ;isolate MAT offset
  304.           LDY PTR        ;save direct page locations $06-$09
  305.           PHY
  306.           LDY PTR+2
  307.           PHY
  308.           ASL            ;double index to 2-byte entries
  309.           TAY            ; in MAT and transfer to Y-reg
  310.           LDAL MSGPOINTER ;set ptr to MAT
  311.           STA PTR
  312.           LDAL MSGPOINTER+1
  313.           STA PTR+1
  314.           LDA [PTR],Y    ;set ptr to MTT
  315.           STA PTR
  316.  
  317. * Print individual characters:
  318.  
  319.           SEP %01110000  ;set m,x,v flags
  320.           LDA [PTR]      ;get 1st char in message
  321.           BEQ BumpPtr    ;zero keeps v-set for MouseText
  322.           CMP #$20
  323.           BCC Repeat     ;repeat signal encountered
  324.           CLV            ;v-clear signals no MouseText
  325. NextChar  LDA [PTR]      ;get char in message
  326.           BEQ EndMsg     ;end of message
  327.           CMP #$20
  328.           BCC Repeat     ;repeat signal encountered
  329.           BVS CharOut    ;allow MouseText
  330.           BMI CharOutEnd ;print last char in message
  331.           ORA #$80       ;disallow MouseText
  332. CharOut   PHP            ;save status
  333.           JSR DoCOUT     ;output char
  334.           PLP            ;restore status
  335. BumpPtr   INC PTR        ;point to next char
  336.           BNE NextChar
  337.           INC PTR+1
  338.           BRA NextChar
  339.  
  340. * End message:
  341.  
  342. CharOutEnd JSR DoCOUT    ;output final char in message
  343. EndMsg    REP %00110000  ;clear m,x flags
  344.           PLA            ;restore direct page locs $06-$09
  345.           STA PTR+2
  346.           PLA
  347.           STA PTR
  348.           SEP %00110000  ;set m,x flags
  349.           RTS            ;return to caller
  350.  
  351. * Print repeat characters:
  352.  
  353. Repeat    TAY            ;Y-reg holds repeat count
  354.           INC PTR        ;point to next char
  355.           BNE RepeatChar
  356.           INC PTR+1
  357. RepeatChar LDA [PTR]     ;get char to repeat
  358.           PHY            ;save counter
  359.           BVS RepeatOut  ;allow MouseText
  360.           ORA #$80       ;disallow MouseText
  361. RepeatOut PHP            ;preserve status
  362.           JSR DoCOUT     ;output repeat char
  363.           PLP            ;restore status
  364.           PLY            ;retrieve counter
  365.           DEY            ;reduce count
  366.           BNE RepeatChar ;more chars to repeat
  367.           BRA BumpPtr    ;exit repeat loop
  368.  
  369. *===============================
  370. * F8 System Monitor Subroutines (Unsupported Entry Points):
  371. *-------------------------------
  372. * Set Emulation Mode:
  373. *-------------------------------
  374.           ORG $FFF8B5
  375.  
  376. SetEmulate PHP           ;save entry status
  377.           SEC            ;set emulation
  378.           XCE            ; mode
  379.           PLP            ;restore status
  380.           RTS
  381. *-------------------------------
  382. * Set Native Mode:
  383. *-------------------------------
  384.           ORG $FFF8D4
  385.  
  386. SetNative PHP            ;save entry status
  387.           CLC            ;set native
  388.           XCE            ; mode
  389.           PLP            ;restore status
  390.           RTL
  391. *-------------------------------
  392. * Set Standard I/O:
  393. *-------------------------------
  394.           ORG $FFFE43
  395.  
  396. SetIO40   JSR SETNORM    ;set normal text mode
  397.           JSR INIT       ;init text screen
  398.           JSR SETVID     ;set standard keyboard input
  399.           JSR SETKBD     ;set standard keyboard output
  400. *-------------------------------
  401. * Set System Speed:
  402. *-------------------------------
  403.           ORG $FFFFD6
  404.  
  405. SetSpeed  LDA CYAREG     ;get speed/motor reg
  406.           AND #$7F       ;clear speed bit
  407.           ORAL $E10137   ;use speed flag to
  408.           STA CYAREG     ; clear/set speed reg
  409.           RTS
  410.           LST OFF
  411.